package com.多用户通讯编程.QQ.Client.Service;

import com.多用户通讯编程.QQ.Client.View.View;
import com.多用户通讯编程.QQ.Common.Message;
import com.多用户通讯编程.QQ.Common.MessageType;
import com.多用户通讯编程.QQ.Common.User;
import com.多用户通讯编程.QQ.Server.QQservice.ManageServerConnectClientThread;
import com.多用户通讯编程.QQ.Server.QQservice.ServerConnectClientThread;
import com.多用户通讯编程.QQ.Utils.Utility;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

@SuppressWarnings("all")
public class UserClientService {
    /// 用于打包发送的对象
    User user = new User();
    /// 通讯的通道
    Socket socket;
    /// 用来返回验证结果；
    boolean b = false;
    ///
    ObjectOutputStream oos;
    ObjectInputStream ois;
    static Scanner sc = new Scanner(System.in);

    /// 验证用户的账号密码是否正确；
    public boolean checkUser(String UserId, String pwd) {
        /// 将要验证的用户和密码打包
        user.setUserId(UserId);
        user.setPassword(pwd);


        try {
            /// 跟9999端口的服务器连接 ， 如果连接成功姐继续，否则关闭
            socket = new Socket(InetAddress.getLocalHost(), 9999);
            /// 连接后获取通道输出流，将对象打包发送出去，
            oos = new ObjectOutputStream(socket.getOutputStream());
            oos.flush();
            oos.writeObject(user);
            oos.flush();
            /// 再得到回复，接受消息对象；
            ois = new ObjectInputStream(socket.getInputStream());
            Message message = (Message) ois.readObject();

            /// 如果回复的消息类型是成功就启动接受服务器消息的线程；
            if (message.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {
                /// 如果检查后用户，密码验证成功，返回true；
                b = true;
                /// 创建按一个与服务端通讯的线程对象ccst，并启动；
                ClientConnectServerThread ccst = new ClientConnectServerThread(socket, ois, oos);

                ccst.start();
                /// 将创建好的线程放入到线程集合中；
                ManageClientConnectServerThread.put(UserId, ccst);
            /// 如果返回的消息类型是 MESSAGE_USER_ALREADY_EXISTS 就说明该用户已经登陆中，无法再次登录；
            } else if (message.getMesType().equals(MessageType.MESSAGE_USER_ALREADY_EXISTS)){
                System.out.println("用户 "+user.getUserId()+"已经存在，无法再次登录!");
                socket.close();
            } else {
                b = false;
                /// 因为验证失败，所以跟服务器连接的通道没用了；关闭；
                socket.close();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return b;
    }

    /// 发送消息给服务器，群发消息
    public void ClientGroupMessaging() {
        //也可以通过线程对象集合拿到线程对象，再拿到该线程对应的输出流；
        //oos = ManageClientConnectServerThread.get(user.getUserId()).getOutputStream();

        String str = "";
        System.out.println("请输入群发消息的内容,输入-1 退出");
        while (!(str = sc.next()).equals("-1")) {
            Message message = new Message();
            /// 消息类型是群发类型
            message.setMesType(MessageType.MESSAGE_TO_ALL_MES);
            /// 发送者
            message.setSender(user.getUserId());
            /// 内容
            message.setContent(str);
            try {
                oos.writeObject(message);
                oos.flush();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            System.out.println("请输入群发消息的内容,输入-1 退出");
        }
    }

    /// 从服务器返回用户列表；消息类型是get
    public void getUsers() {
        Message message = new Message();
        /// 将消息类型设置成GET ， 服务器识别后返回对方在线用户集合；
        message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        message.setContent("请求在线用户列表");
        message.setSender(user.getUserId());
        try {
            oos.writeObject(message);
            oos.flush();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /// 客户端请求退出；
    public void ClientThreadExit() {
        Message message = new Message();
        message.setSender(user.getUserId());
        /// 消息类型是 退出MESSAGE_CLIENT_EXIT ， 通知服务器退出；
        message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
        message.setContent("请求退出系统!");
        try {
            oos.writeObject(message);
            /// 发送后从管理用户与服务器通讯线程集合中 拿到该对象线程
            ClientConnectServerThread clientConnectServerThread = ManageClientConnectServerThread.get(user.getUserId());
            /// 将while（loop） loop设置成false ，停止线程不再接受服务器的消息；
            clientConnectServerThread.setLoop(false);
            /// 从线程集合中删除
            ManageClientConnectServerThread.remove(user.getUserId());
            /// 终止整个客户端程序；
            System.exit(0);

            if (ois != null) ois.close();
            if (socket != null && !socket.isClosed()) socket.close();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        
    }

    /// 私聊方法
    public void SendMessagepPrivately() {
//        ObjectOutputStream oos = ManageClientConnectServerThread.get(user.getUserId()).getOutputStream();
        System.out.println("请输入接收人ID:");
        String getterId = sc.next();
        System.out.println("请输入发送的内容");
        String content = sc.next();

        Message message = new Message();
        /// 发送者
        message.setSender(user.getUserId());
        /// 接收者
        message.setGetter(getterId);
        /// 消息类型是普通消息，也就是私聊；
        message.setMesType(MessageType.MESSAGE_COMM_MES);
        message.setContent(content);
        /// 获取当前时间，设置格式，
        LocalDateTime time = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String sendtime = time.format(formatter);
        /// 保存发送时间；
        message.setSendTime(sendtime);
        try {
            oos.writeObject(message);
            oos.flush();
            oos.reset();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    /// 发送文件
    public void sendFile() {
        String srcPath = "java-code/src/com/多用户通讯编程/img/获取CLass类对象的6种方法.png";
        String destPath = "java-code/src/com/多用户通讯编程/img/acceptImg1.png";
        try {
            /// 将要发送的文件保存到数组中；跟着message对象一起过去；
            byte[] bytes = Utility.streamToByteArray(srcPath);
            Message message = new Message();
            /// 消息类型是文件
            message.setMesType(MessageType.MESSAGE_FILE_MES);
            /// 设置数组，人员之类
            message.setSender(user.getUserId());
            System.out.print("接收方 :");
            message.setGetter(sc.next());
            /// 打包的字节数据，直接发送；
            message.setBytes(bytes);
            message.setDestPath(destPath);
            oos.writeObject(message);
            oos.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
